#ifndef __ANY_HPP__
#define __ANY_HPP__

class Any
{
    class Holder
    {
    public:
        virtual ~Holder()
        {}
        /* 获取数据类型 */
        virtual const std::type_info& Type() const = 0;
        /* 拷贝克隆数据对象 */
        virtual Holder* Clone() = 0;
    };
    template<class T>
    class PlaceHolder : public Holder
    {
    public:
        T _val;
    public:
        PlaceHolder(const T& val): _val(val)
        {}
        /* 获取数据类型 */
        virtual const std::type_info& Type() const/* 如果是传值返回，就会调用拷贝构造，但是type_info将拷贝构造禁用了 */
        {
            return typeid(T);
        }
        /* 拷贝克隆数据对象 */
        virtual Holder* Clone()
        {
            return new PlaceHolder(_val);
        }
    };
private:
    Holder* _content;
public:
    Any(): _content(nullptr)
    {}
    template<class T>
    Any(const T& val): _content(new PlaceHolder<T>(val))
    {}
    Any(const Any& other): _content(other._content ? other._content->Clone() : nullptr)
    {}

    ~Any()
    {
        if(_content) delete _content;
    }

    /* 获取保存的真正数据的指针 */
    template<class T>
    T* Get() const
    {
        return &((PlaceHolder<T>*)_content)->_val;
    }

    /* 赋值运算符重载 */
    Any& operator=(Any& other)
    {
        std::swap(_content, other._content);
        return *this;
    }
    template<class T>
    Any& operator=(const T& val)
    {
        Any(val).Swap(*this);
        return *this;
    }

    /* 交换两个Any */
    void Swap(Any& other)
    {
        std::swap(_content, other._content);
    }
};

#endif